#include <thread>
#include <iostream>
#include <mutex>
#include <chrono>
#include <condition_variable>

bool flag = false;
std::mutex m;
std::condition_variable c;

// std::condition_variable 必须和 std::unique_lock 配合使用
// 在调用 wait 之前需要保证已经获得了互斥元, 然后条件变量会检查
// 条件是否满足, 如果不满足, 就释放锁, 然后阻塞当前线程, 等待被
// 其它线程唤醒, 如果满足, 则继续持有锁并向下执行
void process_data() {
    std::unique_lock<std::mutex> lk(m);
    std::cout << "等待数据预处理..." << std::endl;
    c.wait(lk, []{ return flag; });
    std::cout << "数据处理完成" << std::endl;
}

void prepare_data() {
    // 模拟数据的准备工作
    std::this_thread::sleep_for(std::chrono::seconds(1));
    std::lock_guard<std::mutex> lk(m);
    flag = true;
    std::cout << "数据准备完毕" << std::endl;
    c.notify_one();
}

int main(int argc, char* argv[]) {
    std::thread t1(process_data);
    std::thread t2(prepare_data);
    t1.join();
    t2.join();
    return 0;
}